home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork3.lzh
/
サンプル実用編
/
小遣い帳
/
CSESE.C
< prev
next >
Wrap
Text File
|
1994-03-10
|
19KB
|
591 lines
/******************************************************************************
* csese.c: 日付入力用疑似ダイアログ関数モジュール
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <sxmemory.h> /* メモリマンを利用するときに必要 */
#include <console.h> /* コンソール系マネージャを利用するときに必要 */
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxgraph.h> /* グラフマンを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <text.h> /* テキストマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "cash.h" /* このプログラム固有のヘッダファイル */
short funcKeyTbl[] = { /* ファンクションキーアサインテーブル */
K_HOME, 0, /* [HOME] */
K_DEL, 0x07, /* [DEL] */
K_RUP, 0x03, /* [ROLL UP] */
K_RDOWN, 0x12, /* [ROLL DOWN] */
K_UNDO, 0, /* [UNDO] */
K_LEFT, 0x13, /* [←] */
K_UP, 0x05, /* [↑] */
K_RIGHT, 0x04, /* [→] */
K_DOWN, 0x18, /* [↓] */
K_CLR, 0, /* [CLR] */
K_HELP, 0, /* [HELP] */
K_INS, 0, /* [INS] */
0, 0 /* テーブル終端 */
};
/******************************************************************************
* openEseDlg(): 疑似ダイアログのオープン
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* Window *winPtr ウィンドウポインタ
* char *title ダイアログタイトルへのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗
* 注釈:
* 疑似ダイアログのワークを初期化する。
* 疑似ダイアログの表示はshowEseDlg()で行う。
*/
BOOLEAN openEseDlg(EseDlg *pese, Window *winPtr, char *title)
{
/* 疑似ダイアログの各種座標 */
static Rect rcFrame = { /* 外枠 */
ESE_X + 0, ESE_Y + 0, ESE_X + 221, ESE_Y + 94
};
static Rect rcText = { /* テキスト入力欄(1) */
ESE_X + 14, ESE_Y + 30, ESE_X + 42, ESE_Y + 48
};
static Rect rcText2 = { /* テキスト入力欄(2) */
ESE_X + 64, ESE_Y + 30, ESE_X + 92, ESE_Y + 48
};
static Rect rcPart = { /* 文字ボタンのパーティション */
ESE_X + 118, ESE_Y + 47, ESE_X + 201, ESE_Y + 77
};
/* ダイアログタイトルの表示位置 */
static Point ttlPos = { ESE_X + 15, ESE_Y + 15 };
static Point esettlPos21 = { ESE_X + 45, ESE_Y + 33 }; /* '月' */
static Point esettlPos22 = { ESE_X + 95, ESE_Y + 33 }; /* '日' */
pese->windowPtr = winPtr;
pese->rcFrame = rcFrame; /* 外枠レクタングルの登録 */
pese->rcText[0] = rcText; /* テキスト用のレクタングル */
pese->rcText[1] = rcText2;
pese->rcDest = rcText;
pese->rcPart = rcPart; /* 文字ボタンのパーティション */
pese->ttlPos = ttlPos; /* タイトル表示座標 */
pese->ttlPos2[0] = esettlPos21;
pese->ttlPos2[1] = esettlPos22;
pese->tmode = 0;
pese->visible = 0;
*pese->tBuff[0] = 0; /* 文字列の初期化 */
*pese->tBuff[1] = 0;
pese->title = MMChHdlNew(256); /* タイトル文字列用ハンドルを確保する */
if (pese->title == NULL)
return FALSE;
strcpy(*pese->title, title); /* タイトルを設定する */
if (!createEseText(pese)) /* テキストエディットを作成する */
return FALSE;
if (!createEseControl(pese)) /* コントロールを作成する */
return FALSE;
return TRUE;
}
/******************************************************************************
* closeEseDlg(): 疑似ダイアログのクローズ
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* 注釈:
* 疑似ダイアログを消去し、確保しているコントロールハンドルなど、すべて廃
* 棄します。
*/
void closeEseDlg(EseDlg *pese)
{
int lastFC, lastAP;
if (pese->visible) {
GMSetGraph(&pese->windowPtr->graph);
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_LGRAY);
releaseClip(pese->windowPtr);
GMFillRect(&pese->rcFrame);
addUpdate(pese->windowPtr, &pese->rcFrame);
GMAPage(lastAP);
GMForeColor(lastFC);
}
if (pese->tEdit != NULL) {
/* テキストエディットハンドルを廃棄する */
TMDispose(pese->tEdit);
pese->tEdit = NULL;
}
if (pese->execBtnHdl != NULL) {
CMDispose(pese->execBtnHdl);
pese->execBtnHdl = NULL;
}
if (pese->canBtnHdl != NULL) {
CMDispose(pese->canBtnHdl);
pese->canBtnHdl = NULL;
}
MMHdlDispose(pese->title); /* ハンドルを解放する */
pese->title = NULL;
}
/******************************************************************************
* drawEseDlg(): 疑似ダイアログの描画
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
*/
void drawEseDlg(EseDlg *pese)
{
int lastAP, lastFC, lastBC, lastFK;
int mode;
Point pt;
char str[16];
if (!pese->visible) /* 表示されていないか? */
return;
GMSetGraph(&pese->windowPtr->graph);
releaseClip(pese->windowPtr);
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_BLACK);
lastBC = GMBackColor(G_LGRAY);
lastFK = GMFontKind(G_ROM12);
GMScrewRect(&pese->rcFrame); /* ネジ付レクタングルを表示する */
GMShadowRect(&pese->rcPart);
CMDrawOne(pese->execBtnHdl); /* ボタンを描画する */
CMDrawOne(pese->canBtnHdl);
MMHdlLock(pese->title);
GMShadowStrZ(*pese->title, pese->ttlPos.x_y); /* ボタンを描画する */
MMHdlUnlock(pese->title);
/* 編集モードによる切り替え */
GMShadowStrZ("月", pese->ttlPos2[0].x_y);
GMShadowStrZ("日", pese->ttlPos2[1].x_y);
/* テキスト領域の描画 */
GMBackColor(G_WHITE);
GMShadowRect(&pese->rcText[0]);
GMShadowRect(&pese->rcText[1]);
/* 表示文字列と、表示座標を選択する */
mode = 1 - pese->tmode;
sprintf(str, "%3d\0", pese->value[mode]);
pt.x_y = pese->rcText[mode].l.l_t;
pt.p.x += 3;
pt.p.y += 3;
GMMove(pt.x_y);
GMDrawStrZ(str);
/* テキストエディットの文字列を描画する */
TMUpDate(pese->tEdit, &pese->rcDest);
GMAPage(lastAP);
GMForeColor(lastFC);
GMBackColor(lastBC);
GMFontKind(lastFK);
setClip(pese->windowPtr, &pese->rcFrame);
}
/******************************************************************************
* showEseDlg(): 疑似ダイアログの表示
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
*/
void showEseDlg(EseDlg *pese)
{
int lastFC, lastAP;
if (pese->visible)
return;
GMSetGraph(&pese->windowPtr->graph);
releaseClip(pese->windowPtr);
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_LGRAY);
GMPenHide();
CMShow(pese->execBtnHdl);
CMShow(pese->canBtnHdl);
GMPenShow();
pese->visible = TRUE;
moveEdit(pese, 0); /* 1番目の入力項目を編集可能にする */
/* 全範囲指定の状態にする */
TMSetSelect(pese->tEdit, 0, (*pese->tEdit)->length, 0);
TMShow(pese->tEdit);
GMAPage(lastAP);
GMForeColor(lastFC);
/* アップデートリージョンに登録する */
addUpdate(pese->windowPtr, &pese->rcFrame);
setClip(pese->windowPtr, &pese->rcFrame);
}
/******************************************************************************
* hideEseDlg(): 疑似ダイアログの消去
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
*/
void hideEseDlg(EseDlg *pese)
{
int lastFC, lastAP;
if (!pese->visible) /* 表示されていないか? */
return;
GMSetGraph(&pese->windowPtr->graph);
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_LGRAY);
releaseClip(pese->windowPtr);
pese->visible = FALSE;
CMHide(pese->execBtnHdl);
CMHide(pese->canBtnHdl);
TMHide(pese->tEdit);
GMFillRect(&pese->rcFrame);
addUpdate(pese->windowPtr, &pese->rcFrame);
GMAPage(lastAP);
GMForeColor(lastFC);
}
/******************************************************************************
* createEseText(): 疑似ダイアログ用テキストエディットの作成
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗
*/
BOOLEAN createEseText(EseDlg *pese)
{
int errCode;
/* テキスト用ディスティネーションレクタングルを作成する */
pese->rcDest.d.left += 3;
pese->rcDest.d.top += 3;
pese->rcDest.d.right -= 3;
pese->rcDest.d.bottom -= 3;
errCode = TMNew2(&pese->rcDest, &pese->rcDest, &pese->windowPtr->graph, &pese->tEdit);
if (errCode < 0)
/* テキストエディットが作成できなかった */
return FALSE;
(*pese->tEdit)->lenMax = 3; /* 入力最大文字数を設定する */
(*pese->tEdit)->lineHeight = T_LHEIGHT; /* 改行幅を設定する */
(*pese->tEdit)->editMode = 0; /* 編集モードを通常表示にする */
/* ファンクションキーアサインテーブルを設定する */
(*pese->tEdit)->funcCode = funcKeyTbl;
return TRUE;
}
/******************************************************************************
* createEseControl(): 疑似ダイアログ上のコントロールの作成
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗
*/
BOOLEAN createEseControl(EseDlg *pese)
{
static Rect rcExecBtn = { /* [実行]ボタン */
ESE_X + 124, ESE_Y + 53, ESE_X + 154, ESE_Y + 72
};
static Rect rcCanBtn = { /* [取消]ボタン */
ESE_X + 166, ESE_Y + 53, ESE_X + 196, ESE_Y + 72
};
pese->execBtnHdl = CMOpen(pese->windowPtr, &rcExecBtn,
(_LASCII)"\x04実行", FALSE, 0, 0, 1, CI_CHRBTN << 4, 0);
if (pese->execBtnHdl == NULL)
return FALSE;
pese->canBtnHdl = CMOpen(pese->windowPtr, &rcCanBtn,
(_LASCII)"\x04取消", FALSE, 0, 0, 1, CI_CHRBTN << 4, 0);
if (pese->canBtnHdl == NULL)
return FALSE;
return TRUE;
}
/******************************************************************************
* caretEseDlg(): 疑似ダイアログのカーソル制御
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* BOOLEAN sw = TRUE: 表示
* = FALSE: 消去
*/
void caretEseDlg(EseDlg *pese, BOOLEAN sw)
{
int lastAP, lastFC, lastBC, lastFK;
if (!pese->visible) /* 表示されていないか? */
return;
GMSetGraph(&pese->windowPtr->graph);
releaseClip(pese->windowPtr); /* クリッピングを解除する */
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_BLACK);
lastBC = GMBackColor(G_WHITE);
lastFK = GMFontKind(G_ROM12);
TMCaret(pese->tEdit, sw); /* カーソルをオン/オフする */
GMAPage(lastAP);
GMForeColor(lastFC);
GMBackColor(lastBC);
GMFontKind(lastFK);
setClip(pese->windowPtr, &pese->rcFrame); /* クリッピングを戻す */
}
/******************************************************************************
* eseDlgEvent(): イベントに応じた処理
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* TsEvent *ptsev タスクマンイベントレコードへのポインタ
* 戻り値: int num = 1: [実行]ボタン
* = 2: [取消]ボタン
*/
int eseDlgEvent(EseDlg *pese, TsEvent *ptsev)
{
int lastAP, lastFC, lastBC, lastFK;
int keyCode; /* キーコード */
int shortCut; /* ショートカットキー */
int num = 0, len;
int partCode; /* コントロールのパートコード */
LPoint lpt;
Control **ctrlHdl; /* コントロールハンドル */
if (!pese->visible) /* 表示されていないか? */
return 0;
GMSetGraph(&pese->windowPtr->graph);
releaseClip(pese->windowPtr);
/* アクセスページを0と1ページにする */
lastAP = GMAPage(G_PAGE0 | G_PAGE1);
lastFC = GMForeColor(G_BLACK);
lastBC = GMBackColor(G_WHITE);
lastFK = GMFontKind(G_ROM12);
switch (ptsev->ts.what) {
case E_IDLE: /* アイドルイベント */
TMEventW(pese->tEdit, ptsev); /* カーソルを点滅させる */
break;
case E_KEYDOWN: /* キーダウンイベント */
/* ファンクションアサインテーブルによりキーコードを変換する */
keyCode = TMKeyToAsk(pese->tEdit, ptsev);
if (keyCode == -2) { /* テーブルに登録されてないか? */
/* OPT.1キーが押されたか? */
if (ptsev->ev.how & KS_OPT1) {
/* キー入力した文字を大文字に変換する */
shortCut = toupper((int) ptsev->ev.whom.key.ascii);
switch (shortCut) {
case 'Q': /* 終了 */
num = 2; /* [取消]ボタン */
break;
default:
/* テキストマンのショートカットに
対応する */
TMEventW(pese->tEdit, ptsev);
break;
}
} else {
switch (ptsev->ev.whom.key.ascii) {
case '\r': /* リターンキーかENTERキー */
if (pese->tmode == 0)
moveEdit(pese, 1);
else {
moveEdit(pese, 1);
num = 1; /* [実行]ボタン */
}
break;
case '\x1b': /* ESCキー */
num = 2; /* [取消]ボタン */
break;
default: /* その他のキー */
TMEventW(pese->tEdit, ptsev);
break;
}
}
} else
/* その他のキーの場合 */
TMEventW(pese->tEdit, ptsev);
break;
case E_MSLDOWN: /* マウスレフトダウンイベント */
/* ダイアログより外の座標は、チェックしない */
lpt = GMGlobalToLocal(ptsev->ev.where.x_y);
if (GMPtInRect(&pese->rcFrame, lpt)) {
partCode = CMFind(lpt, pese->windowPtr, &ctrlHdl);
/* [実行]ボタンが押されたか? */
if (ctrlHdl == pese->execBtnHdl) {
if (CMCheck(ctrlHdl, lpt, NULL) == C_INBTTN) {
/* 現在の編集文字列を待避 */
len = TMGetText(pese->tEdit, pese->tBuff[pese->tmode], 3);
pese->tBuff[pese->tmode][len] = 0;
num = 1; /* [実行]ボタン */
}
/* [取消]ボタンが押されたか? */
} else if (ctrlHdl == pese->canBtnHdl) {
if (CMCheck(ctrlHdl, lpt, NULL) == C_INBTTN)
num = 2; /* [取消]ボタン */
} else if (GMPtInRect(&pese->rcDest, lpt))
/* 編集領域内にポインタがある */
TMEventW(pese->tEdit, ptsev);
else if (GMPtInRect(&pese->rcText[0], lpt))
moveEdit(pese, 0);
else if (GMPtInRect(&pese->rcText[1], lpt))
moveEdit(pese, 1);
}
break;
case E_MSRDOWN: /* マウスライトダウンイベント */
TMEventW(pese->tEdit, ptsev);
break;
}
GMAPage(lastAP);
GMForeColor(lastFC);
GMBackColor(lastBC);
GMFontKind(lastFK);
setClip(pese->windowPtr, &pese->rcFrame);
return num;
}
/******************************************************************************
* getEseVal(): 日付の取得
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* int *data 値を格納するポインタ
* int mode 取得する項目
* = 0: 月
* = 1: 日
* 戻り値: int < 0: 取得失敗
* >= 0: 取得成功
*/
int getEseVal(EseDlg *pese, int *data, int mode)
{
int len, fields;
char str[16];
len = TMGetText(pese->tEdit, str, 3);
str[len] = 0;
/* 数値に変換 */
fields = sscanf(str, "%d", &pese->value[pese->tmode]);
if (fields < 1)
pese->value[pese->tmode] = 0;
*data = pese->value[mode];
return len;
}
/******************************************************************************
* setEseVal(): 日付の設定
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* int data 日付の値へのポインタ
* int mode 設定項目
* = 0: 月
* = 1: 日
* 戻り値: int errCode < 0: 設定失敗
* >= 0: 設定成功
*/
int setEseVal(EseDlg *pese, int data, int mode)
{
int len, errCode = 0;
char str[16];
pese->value[mode] = data; /* 値をワークにコピーする */
if (pese->tmode == mode) {
/* 指定の編集領域が編集中であれば */
len = sprintf(str, "%3d", data);
errCode = TMSetText(pese->tEdit, str, len);
}
if (pese->visible)
/* 表示されていればアップデートする */
addUpdate(pese->windowPtr, &pese->rcDest);
return errCode;
}
/******************************************************************************
* moveEdit(): 入力項目の変更
******************************************************************************
* 引数: EseDlg *pese 疑似ダイアログレコードへのポインタ
* int mode 入力項目
* = 0: 月
* = 1: 日
* 注釈: カーソルを移動して入力項目の変更を行います。
*/
void moveEdit(EseDlg *pese, int mode)
{
int len, fields;
char str[16];
if (pese->tmode == mode)
/* 編集テキストが以前と同じならば */
return;
TMHide(pese->tEdit);
/* テキスト用ディスティネーションレクタングルを作成する */
pese->rcDest = pese->rcText[mode];
pese->rcDest.d.left += 3;
pese->rcDest.d.top += 3;
pese->rcDest.d.right -= 3;
pese->rcDest.d.bottom -= 3;
/* テキスト編集のレクタングルを再設定する */
TMSetRect(pese->tEdit, &pese->rcDest, &pese->rcDest);
len = TMGetText(pese->tEdit, str, 3); /* 編集文字列を待避する */
str[len] = 0;
fields = sscanf(str, "%d", &pese->value[pese->tmode]);
if (fields < 1)
pese->value[pese->tmode] = 0;
/* 移動先のテキストに文字列を設定する */
len = sprintf(str, "%3d", pese->value[mode]);
TMSetText(pese->tEdit, str, len);
pese->tmode = mode;
TMShow(pese->tEdit);
TMSetSelect(pese->tEdit, 0, (*pese->tEdit)->length, 0);
if (pese->visible) {
/* 表示されていればアップデートする */
addUpdate(pese->windowPtr, &pese->rcText[0]);
addUpdate(pese->windowPtr, &pese->rcText[1]);
}
}
/******************************************************************************
* setClip(): クリッピングの設定
******************************************************************************
* 引数: Window *winPtr ウィンドウポインタ
* Rect *prect レクタングルへのポインタ
*/
void setClip(Window *winPtr, Rect *prc)
{
Region **rgnHdl;
rgnHdl = GMNewRgn();
if (rgnHdl == NULL) {
DMError(D_CONFIRM, "メモリが確保できません。");
return;
}
GMRectRgn(rgnHdl, &winPtr->graph.rect);
GMDiffRectRgn(rgnHdl, rgnHdl, prc);
GMSetClip(rgnHdl);
GMDisposeRgn(rgnHdl); /* リージョンハンドルを解放する */
}
/******************************************************************************
* releaseClip(): クリッピングの解除
******************************************************************************
* 引数: Window *winPtr ウィンドウポインタ
*/
void releaseClip(Window *winPtr)
{
GMClipRect(&winPtr->graph.rect);
}